package com.scheduling.inventory.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.scheduling.inventory.dto.MaterialInventoryDTO;
import com.scheduling.inventory.dto.MaterialInventoryQueryDTO;
import com.scheduling.inventory.entity.MaterialInventory;

import java.math.BigDecimal;
import java.util.List;

/**
 * 原料库存Service接口
 *
 * @author 开发团队
 * @since 2025-05-29
 */
public interface MaterialInventoryService extends IService<MaterialInventory> {

    /**
     * 分页查询原料库存
     *
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<MaterialInventoryDTO> getInventoryPage(MaterialInventoryQueryDTO queryDTO);

    /**
     * 根据库存ID获取库存信息
     *
     * @param inventoryId 库存ID
     * @return 库存信息
     */
    MaterialInventoryDTO getInventoryById(String inventoryId);

    /**
     * 根据原料ID获取库存信息
     *
     * @param materialId 原料ID
     * @return 库存信息
     */
    MaterialInventoryDTO getInventoryByMaterialId(String materialId);

    /**
     * 新增原料库存
     *
     * @param inventoryDTO 库存信息
     * @return 操作结果
     */
    boolean createInventory(MaterialInventoryDTO inventoryDTO);

    /**
     * 更新原料库存
     *
     * @param inventoryDTO 库存信息
     * @return 操作结果
     */
    boolean updateInventory(MaterialInventoryDTO inventoryDTO);

    /**
     * 删除原料库存
     *
     * @param inventoryId 库存ID
     * @return 操作结果
     */
    boolean deleteInventory(String inventoryId);

    /**
     * 批量删除原料库存
     *
     * @param inventoryIds 库存ID列表
     * @return 操作结果
     */
    boolean batchDeleteInventory(List<String> inventoryIds);

    /**
     * 调整库存数量
     *
     * @param materialId 原料ID
     * @param quantity   调整数量（正数增加，负数减少）
     * @param reason     调整原因
     * @return 操作结果
     */
    boolean adjustInventoryQuantity(String materialId, BigDecimal quantity, String reason);

    /**
     * 获取库存不足的原料列表
     *
     * @return 库存不足的原料列表
     */
    List<MaterialInventoryDTO> getLowStockMaterials();

    /**
     * 检查原料库存是否充足
     *
     * @param materialId       原料ID
     * @param requiredQuantity 所需数量
     * @return 是否充足
     */
    boolean checkInventorySufficient(String materialId, BigDecimal requiredQuantity);

    /**
     * 消费原料库存
     *
     * @param materialId 原料ID
     * @param quantity   消费数量
     * @param reason     消费原因
     * @return 操作结果
     */
    boolean consumeInventory(String materialId, BigDecimal quantity, String reason);

    /**
     * 补充原料库存
     *
     * @param materialId 原料ID
     * @param quantity   补充数量
     * @param reason     补充原因
     * @return 操作结果
     */
    boolean replenishInventory(String materialId, BigDecimal quantity, String reason);
} 